/*
    文件内容: Acceptor类,监听类,处理TcpServer中绑定和listen的相关操作
    文件名: Acceptor.cpp
    作者: 中国好青年(码农论坛)
    时间: 2024/9/8
*/
#include "Acceptor.h"

/* 
    函数名: Acceptor(EventLoop* loop, Socket* clientsock)
    返回值: 无
    参  数: EventLoop* loop, epoll根; const std::string &ip, IP地址; uint16_t port, 端口号
    函数作用: 封装处理服务端绑定等业务
*/
Acceptor::Acceptor(EventLoop* loop,const std::string &ip, uint16_t port)
                  :loop_(loop), serversock_(createNonblockSock()), acceptchan_(loop_, serversock_.fd())
{
    InetAddress servaddr(ip, port);
    serversock_.setKeepAlive(true);
    serversock_.setReuseAddr(true);
    serversock_.setReusePort(true);
    serversock_.setTcpNodelay(true);
    serversock_.bind(servaddr);
    serversock_.listen();

    //创建epoll句柄
    acceptchan_.setReadCallback(std::bind(&Acceptor::newConnection, this));
    acceptchan_.enableReadEvent();

}

/* 
    函数名: ~Acceptor()
    返回值: 无
    参  数: 无
    函数作用: 析构函数, 释放serversock_,acceptchan_;
*/
Acceptor::~Acceptor()
{   

}

/* 
    函数名: newConnection(Socket* servsock)
    返回值: 无
    参  数: 监听fd的sock类
    函数作用: 处理新连接上来的数据
*/
void Acceptor::newConnection()
{
    InetAddress clientaddr;
    std::unique_ptr<Socket> clientsock(new Socket(serversock_.accept(clientaddr)));
    clientsock->setIpAndPort(clientaddr.ip(), clientaddr.port());

    //添加epoll到句柄中
    if(newconncallback_)
        newconncallback_(std::move(clientsock));
}

/* 
    函数名: setNewconnCallback(std::function<void(Socket*)> fn)
    返回值: 无
    参  数: 回调函数
    函数作用: 赋值回调函数
*/
void Acceptor::setNewconnCallback(std::function<void(std::unique_ptr<Socket>)> fn){
    newconncallback_ = fn;
}
